package gorm2mysql

import (
	"fmt"

	"gitee.com/z1gotool/z1err"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/schema"
)

// Gen new gorm DB
//
// # Use z1AddField
//
// gitee.com/z1gotool/gormplugin/z1add_field
//
// err:=Z1DB.Use(&z1add_field.Z1AddField{})
//
// z1err.Check(err)
//
// gitee.com/z1gotool/gormplugin/z1util
//
// db = z1util.UpdateDBContext(
//
//	// `z1AddFieldInsert`,
//	`z1AddFieldWhere`,
//	map[string]interface{}{
//		`place_id`: 73501,
//	},
//	db,
//	false,
//
// )
func NewDB(databaseSetting DatabaseSetting, gormConfig gorm.Config) (db *gorm.DB, err error) {
	defer z1err.Handle(&err)

	var dialector gorm.Dialector

	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=%s&parseTime=%t&loc=Local",
		databaseSetting.UserName,
		databaseSetting.Password,
		databaseSetting.Host,
		databaseSetting.DBName,
		databaseSetting.Charset,
		databaseSetting.ParseTime,
	)

	dialector = mysql.New(mysql.Config{
		DSN:                       dsn,  // DSN data source name
		DefaultStringSize:         256,  // string 类型字段的默认长度
		DisableDatetimePrecision:  true, // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true, // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true, // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false,
	})

	if gormConfig.NamingStrategy == nil {
		gormConfig.NamingStrategy = schema.NamingStrategy{
			// TablePrefix:   "t_", // 表名前缀，`User` 的表名应该是 `t_users`
			SingularTable: true, // 使用单数表名，启用该选项，此时，`User` 的表名应该是 `t_user`
		}
	}

	dbTmp, err := gorm.Open(dialector, &gormConfig)
	z1err.Check(err)

	db = dbTmp

	return
}

type DatabaseSetting struct {
	UserName  string
	Password  string
	Host      string
	DBName    string
	Charset   string
	ParseTime bool
}
